create or replace
PROCEDURE SP_LIQUIDACION_INCREMENTALES( p_coPrograma IN NUMBER,
                                p_coUsuarioCreador IN VARCHAR2,
                                p_coPeriodoLiquidacion IN NUMBER, 
                                p_daFechaInicioLiquidacion IN VARCHAR2,
                                p_daFechaFinLiquidacion IN VARCHAR2
) IS

  daFechaAnteriorInicioLiq DATE;
  contador NUMBER;  
  coPeriodoLiquidacionAnterior NUMBER;
  coProgramaAfiliado NUMBER;
  vaInclusionMinimo NUMBER;
  vaInclusionMaximo NUMBER;
  vaExclusionVariacion NUMBER;
  vaNumeroRecordatorios NUMBER;
  coClientePersona NUMBER;
  vaCantidadActual NUMBER;
  vaCantidadAnterior NUMBER;
  vaVariacionCliente NUMBER;
  dePremio VARCHAR2(100);
  vaCantidadMinimaRequerida NUMBER;
  vaCantidadPremio NUMBER;
  otro_contador NUMBER;

BEGIN
  
  --clpb_incremental clpd_premio_incremental clpm_incremental_premiado clpm_liquidacion_incremental
  delete clpm_incremental_premiado where co_periodo_liquidacion = p_coPeriodoLiquidacion;
  delete clpm_liquidacion_incremental where co_periodo_liquidacion = p_coPeriodoLiquidacion;
  commit;
  select to_date(p_daFechaInicioLiquidacion, 'dd/MM/yyyy') - 1 into daFechaAnteriorInicioLiq from dual;
  dbms_output.put_line('daFechaAnteriorInicioLiq '|| daFechaAnteriorInicioLiq); 

  select count(*) into contador  from clpr_periodo_liquidacion 
    where co_programa = p_coPrograma
        and daFechaAnteriorInicioLiq between da_fecha_inicio and da_fecha_fin
        and st_periodo_liquidacion = 'Y';
  
  if contador > 0 then
  
    select id into coPeriodoLiquidacionAnterior  from clpr_periodo_liquidacion 
      where co_programa = p_coPrograma
        and daFechaAnteriorInicioLiq between da_fecha_inicio and da_fecha_fin
        and st_periodo_liquidacion = 'Y'; 
        
  else
    coPeriodoLiquidacionAnterior := -1;
  end if;
   
  dbms_output.put_line('coPeriodoLiquidacionAnterior '|| coPeriodoLiquidacionAnterior); 
  
  otro_contador := 0;
    for programaAfiliado in 
            (
                select id as coProgramaAfiliado, va_inclusion_minimo as vaInclusionMinimo, 
                      va_inclusion_maximo as vaInclusionMaximo, va_exclusion_variacion as vaExclusionVariacion, 
                      va_numero_recordatorios as vaNumeroRecordatorios      
                  from clpb_incremental 
                  where co_programa = p_coPrograma and st_incremental = 'Y'  
            )      
    loop
    
      dbms_output.put_line(' ----------- programaAfiliado -----------');
      coProgramaAfiliado := programaAfiliado.coProgramaAfiliado;
      vaInclusionMinimo := programaAfiliado.vaInclusionMinimo;
      vaInclusionMaximo := programaAfiliado.vaInclusionMaximo;
      vaExclusionVariacion := programaAfiliado.vaExclusionVariacion;
      vaNumeroRecordatorios := programaAfiliado.vaNumeroRecordatorios;
            
      for consumoClientePrograma in 
                (                
                    select hl_actual.co_cliente_persona as coClientePersona, 
                          hl_actual.va_cantidad as vaCantidadActual, 
                          hl_anterior.va_cantidad as vaCantidadAnterior  
                    from clpm_historial_liquidacion hl_actual left outer join clpm_historial_liquidacion hl_anterior 
                      on hl_actual.co_cliente_persona = hl_anterior.co_cliente_persona
                          and hl_anterior.co_periodo_liquidacion = coPeriodoLiquidacionAnterior 
                         -- and hl_actual.co_cliente_persona = 52730 
                    where hl_actual.co_periodo_liquidacion = p_coPeriodoLiquidacion 
                    order by hl_actual.co_cliente_persona asc                   
                )      
      loop
        
        dbms_output.put_line(' ********* consumoClientePrograma *********');
        
        coClientePersona := consumoClientePrograma.coClientePersona;
        vaCantidadActual := consumoClientePrograma.vaCantidadActual;
        vaCantidadAnterior := consumoClientePrograma.vaCantidadAnterior;
        
        dbms_output.put_line('coClientePersona ' ||coClientePersona);      
        dbms_output.put_line('vaCantidadActual ' ||vaCantidadActual);      
        dbms_output.put_line('vaCantidadAnterior ' ||vaCantidadAnterior);      
        
        if consumoClientePrograma.vaCantidadAnterior is not null then
        
            dbms_output.put_line('vino no nulo ');  
            
            vaVariacionCliente := vaCantidadActual - vaCantidadAnterior;
            dbms_output.put_line('vaVariacionCliente ' ||vaVariacionCliente);  
            if vaCantidadActual >= vaInclusionMinimo and 
                vaCantidadActual <= vaInclusionMaximo and 
                  vaVariacionCliente <= vaExclusionVariacion then
                
              insert into clpm_liquidacion_incremental(
                        id, 
                        va_cantidad, 
                        co_incremental, 
                        co_cliente_persona, 
                        co_periodo_liquidacion, 
                        va_variacion, 
                        co_usuario_creador, 
                        da_fecha_creacion) 
                  values(seq_liquidacion_prog_afilia.nextval, 
                          vaCantidadActual, 
                          coProgramaAfiliado, 
                          coClientePersona, 
                          p_coPeriodoLiquidacion, 
                          vaVariacionCliente, 
                          p_coUsuarioCreador, 
                          sysdate); 
            end if;
            
            select count(*) into contador 
            from clpd_premio_incremental 
            where co_incremental = coProgramaAfiliado 
              and va_cantidad_minima_requerida <= vaVariacionCliente
              and st_premio_incremental = 'Y';
            
            if contador > 0 then
            
              select dePremio, vaCantidadMinimaRequerida, vaCantidadPremio 
                  into dePremio, vaCantidadMinimaRequerida, vaCantidadPremio 
              from(
                  select de_premio_incremental as dePremio, 
                        va_cantidad_minima_requerida as vaCantidadMinimaRequerida, 
                        va_cantidad_premio as vaCantidadPremio
                    from clpd_premio_incremental 
                    where co_incremental = coProgramaAfiliado 
                        and va_cantidad_minima_requerida <= vaVariacionCliente
                        and st_premio_incremental = 'Y' 
                    order by va_cantidad_minima_requerida desc
              ) t 
              where rownum = 1;   
              
              insert into clpm_incremental_premiado(
                        id, 
                        va_cantidad,
                        va_cantidad_ganada,
                        co_incremental, 
                        co_cliente_persona, 
                        co_periodo_liquidacion, 
                        de_mensaje_premio, 
                        va_repeticion_mensaje, 
                        va_repeticiones, 
                        va_variacion,
                        co_usuario_creador, 
                        da_fecha_creacion) 
                  values(seq_afiliado_premiado.nextval, 
                          vaCantidadActual, 
                          vaCantidadPremio, 
                          coProgramaAfiliado, 
                          coClientePersona, 
                          p_coPeriodoLiquidacion, 
                          dePremio, 
                          0, 
                          vaNumeroRecordatorios, 
                          vaVariacionCliente,
                          p_coUsuarioCreador,
                          sysdate);

            end if;  
        else
            dbms_output.put_line('vino nulo ');   
            
            if vaCantidadActual >= vaInclusionMinimo and 
                vaCantidadActual <= vaInclusionMaximo then
                
              insert into clpm_liquidacion_incremental(
                        id, 
                        va_cantidad, 
                        co_incremental, 
                        co_cliente_persona, 
                        co_periodo_liquidacion, 
                        co_usuario_creador, 
                        da_fecha_creacion) 
                  values(seq_liquidacion_prog_afilia.nextval, 
                          vaCantidadActual, 
                          coProgramaAfiliado, 
                          coClientePersona, 
                          p_coPeriodoLiquidacion, 
                          p_coUsuarioCreador, 
                          sysdate); 
            end if;            
        end if;
      
      end loop;
      
    end loop;  
    commit;
    dbms_output.put_line('otro_contador incremental '|| otro_contador); 
  exception when no_data_found then
    dbms_output.put_line(' Hubo una excepcion');     
   
  
END SP_LIQUIDACION_INCREMENTALES;